from scapy.all import *
import socket
import time

def syn_scan(ip, puerto, interfaz='eth0'):
    src_mac = get_if_hwaddr(interfaz)
    dst_mac = getmacbyip(ip) 
    dst_ip  = ip

    puerto_cerrado = 4
    puerto_abierto = 18

    paquete = (
        Ether(
            src=src_mac,
            dst=dst_mac
        )/IP(
            dst=dst_ip
        )/TCP(
            sport=RandShort(),
            dport=puerto,
            flags='S',
            seq=RandShort()
        )
    )
    respuesta = srp1(paquete,timeout=15)  
    resultado = 'Filtrado'
    if respuesta: 
        print respuesta.getlayer(TCP).flags
        if respuesta.getlayer(TCP).flags & puerto_cerrado == puerto_cerrado:
	        resultado = "Cerrado"
        if respuesta.getlayer(TCP).flags & puerto_abierto == puerto_abierto:
	        resultado = "Abierto"
    return resultado


def connect_scan(ip, puerto):
    s = socket.socket()
    s.settimeout(15)
    try:
        s.connect((ip,puerto)) # si se puede conectar entonces asumo que esta abierto
        resultado = "Abierto"
        s.close()
    except :
        resultado = "Cerrado o Filtrado" 
        # si no se puede conectar, lo unico que sabe es que el puerto es 
        # inalcanzable. Por lo que no puede determinar si es filtrado o cerrado
    return resultado


def medir_tiempo_syn_scan(ip, puerto):
    total = 0
    for i in range(0,20):
        start = time.time()
        syn_scan(ip, puerto)
        end = time.time()
        total = total + end - start
    return total/20

def medir_tiempo_connect_scan(ip, puerto):
    total = 0
    for i in range(0,20):
        start = time.time()
        connect_scan(ip, puerto)
        end = time.time()
        total = total + end - start
    return total/20

